package com.atwisdom.star.common.vo;

import com.atwisdom.star.common.pojo.*;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 操作（请求）数据
 * @param <T> 泛型
 */
@Component
@Data
public class ActionData<T> {
    private String action;                          //操作
    private String model;                           //所属模型类型 包括 entity/bi/process/opProcess/monitor/planner/routing/simpleMap/statisticsTemplate
    private List<T> data;                           //交互数据，增、改交互的操作数据
    //数据查询定位
    private Long id;                              //模型或实例标识 删、改、查用,不必须
    private Long instanceId;                      //模型或实例标识 删、改、查用,不必须
    private Long containerId;                     // 容器id
    private String containerModel;                     // 容器id
    private List<Long> ids;                       //按ids数组，进行查询，和批量删除
    private List<String> instanceIds;               //按ids数组，进行查询，和批量删除
    private String parentId;                          //关系模型或实例nodeId 删、改、查用,不必须
    private String nodeId;                          //关系模型或实例nodeId 删、改、查用,不必须
    private List<String> nodeIds;                   //按关系模型nodeIds数组，进行查询，和批量删除
    private String name;                            //模型或实例标识 删、改、查用,不必须
    private String category;                        //分类
    private List<String>  names;                    //模型或实例标识 删、改、查用,不必须
    private String type;                            //模型或实例类型 增、删、改、查用,不必须
    private String className;                       //模型类名称 增、删、改、查使用,必须
    private boolean needHier = true;                //是否需要hier数据，默认为true
    private BigDecimal version;                     //模型类版本 增、删、改、查使用,必须
    private String condition;                       //字符串查询表达式 删、改、查使用,不必须
    private String hierValueCondition;              //hier查询条件
    private String exceptionMsg;              //异常提示信息
    private String uniqueKey;  //确定记录比对的Key,如：背番号
    private JSONObject values;  //记录
    //是否更新空值（null,""）这两种性况
    private boolean updateNullFlag = false;
    private boolean hiddenHierData = false;
    /**
     * 查询结果的过滤条件，主要支持公式过滤，如：sum(quantity)>=50， 表示数量汇总只要大于50，其他的数据就被过滤掉不显示
     */
    private String filter;
    private boolean needRootFlag;                   //是否需要Hier中的root节点
    private String orderBy;                         // “id,asc;className,updateTime,desc”
    private int pageNumber = -1;                    //分页查询，第几页
    private int pageSize = 0;                       //分页查询，每页条数
    private List<String> classNames;                //按className数组，进行查询，和批量删除
    private String sourceClassName;                 //原模型类名，更新模型名称使用时的老名称
    private String oldType;                         //模型或实例类型 增、删、改、查用,不必须
    private String oldClassName;                    //目标模型类名，更新模型名称使用时的老名称
    private String targetClassName;                 //目标模型类名，更新模型名称使用时的老名称
    private boolean backOpData = true;              //返回操作数数标志位
    private MultipartFile file;                     //文件类型
    private String status;                     //文件类型

    // 复制记录时，需要更新的字段
    private Map<String, Object> updateFieldMap;
    // 复制的条数
    private Integer copyCount;
    //region hier中的Link信息
    private String linkModel;
    private String linkType;
    private String linkClassName;
    /**
     * 1. 分组查询时的key
     * 2. 从结果中filter时，如果key与之前的值相等，不能被过滤掉
     */
    private String groupKey;
    private List<String> groupByList;
    private String sumKey;

    //查询link实例的条件
    private String linkCondition;
    //endregion


    private String routingClassName;                //工艺路线类名
    private String workCenterClassName;             //工作中心类名
    //工作中心事件传参
    private JSONObject param;                  //事件参数

    //统计传参
    private JSONObject statisticsState;             //统计全局参数（统计事件服务使用）
    private JSONObject statisticsParam;             //统计请求参数
    private JSONObject statisticsInstanceParam;     //统计公式参数
    private String statisticsExpression;            //统计公式
    private Map<String, String> statisticsJsonPathMap;            //统计取值路径

    // 新的统计参数
    private StatisticsParamData statisticsParamData;

    //  表达式计算使用
    private Expression expression;                  //表达式计算对象，包括查询定位和计算
    private String field;                           //字段
    private String calculateType;                   //计算类型
    private String formula;                         //公式
    private String saveTo;                          //计算结果保存于key

    //  累加计算参数
    private String accumulateFieldName;
    //  唯一确定一条记录的字段名称
    private List<String> uniqueFieldNameList;
    // 扣减的字段名
    private String deductFieldName;
    // 数据中要扣减的字段名
    private String dataDeductFieldName;
    // 需要被覆盖的新字段名称
    private List<String> coverFieldNameList;
    // 字段映射规则
    private List<String> fieldMapList;
}